﻿import flash.net.FileReference;
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.utils.Timer;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.managers.PopUpManager;

[Bindable]
private var contenido : XML;

[Bindable]
private var archivos : ArrayCollection;

[Bindable]
private var comentarios : String;

[Bindable]
private var bytesTotal : Number;

private var timer : Timer;

private var idx : int = -1;

private var currentUfi : UploadFileItem;

public var terminado : Function;

private var sessionId : String;

public function upload(sid : String, c : XML, a : ArrayCollection, com : String) : void {
	timer = new Timer(1000);
	timer.addEventListener("timer", updateAll);
	timer.start();
	
	sessionId = sid;
	
	contenido = c;
	archivos = new ArrayCollection();
	var i : int;
	bytesTotal = 0;
	for (i = 0; i < a.length; i++) {
		archivos.addItem(new UploadFileItem(a[i]));
		bytesTotal += a[i].size;
		trace(a[i].size);
	}
	trace(bytesTotal);
	
	comentarios = com;
	
	procesarSiguiente();
}

private function cancelar() : void {
	if (currentUfi != null) {
		currentUfi.file.cancel();
	}
	
	cerrarVentana();
}

private function cerrarVentana() : void {
	timer.stop(); 
	PopUpManager.removePopUp(this);
}

private function updateAll(evento : Object) : void {
	var i : int;
	var proc : Number = 0;
	for (i = 0; i < archivos.length; i++) {
		var ufi : UploadFileItem = archivos[i] as UploadFileItem;
		proc += ufi.proceso;
		var ui : UploadItem = lista.indexToItemRenderer(i) as UploadItem;
		if (ui != null) {
			ui.actualizar();
		}
	}
	avance.setProgress(proc, bytesTotal);
}

private function procesarSiguiente() : void {
	if (currentUfi != null) {
		unregisterUfi();
	} else {
		avance.indeterminate = false;
	}
	
	idx += 1;
	if (idx < archivos.length) {
		lista.selectedIndex = idx;
		lista.scrollToIndex(idx);
		
		currentUfi = archivos[idx] as UploadFileItem;
		registerUfi();
		
		var url : URLRequest = new URLRequest(Configuracion.getHost() + "flex-archivos-upload.php");
		url.method = "post";
		
		var request : URLVariables = new URLVariables();
		request.comentarios = comentarios;
		request.contenidoId = contenido.@id;
		request.sessionId = sessionId;
		
		url.data = request;
		
		currentUfi.file.upload(url, "file", false);
	} else {
		fin();
	}
}

private function fin() : void {
	terminado(archivos);
	cerrarVentana();
}

private function unregisterUfi() : void {
	var fr : FileReference = currentUfi.file;
	
	fr.removeEventListener("cancel", evtCancel);
	fr.removeEventListener("complete", evtComplete);
	fr.removeEventListener("ioError", evtIoError);
	fr.removeEventListener("open", evtOpen);
	fr.removeEventListener("progress", evtProgress);
	fr.removeEventListener("securityError", evtSecurityError);
	fr.removeEventListener("uploadCompleteData", evtUploadCompleteData);
}

private function registerUfi() : void {
	var fr : FileReference = currentUfi.file;
	
	fr.addEventListener("cancel", evtCancel);
	fr.addEventListener("complete", evtComplete);
	fr.addEventListener("ioError", evtIoError);
	fr.addEventListener("open", evtOpen);
	fr.addEventListener("progress", evtProgress);
	fr.addEventListener("securityError", evtSecurityError);
	fr.addEventListener("uploadCompleteData", evtUploadCompleteData);
}

private function evtCancel(evento : Object) : void {
	currentUfi.estatus = "Cancelado";
	fin();
}

private function evtComplete(evento : Object) : void {
	trace(evento);
	currentUfi.estatus = "Completado";
	procesarSiguiente();
}

private function evtIoError(evento : IOErrorEvent) : void {
	trace(evento);
	currentUfi.estatus = "Error";
	procesarSiguiente();
}

private function evtOpen(evento : Object) : void {
	currentUfi.inconcluso = false;
}

private function evtProgress(evento : ProgressEvent) : void {
	currentUfi.proceso = evento.bytesLoaded;
	currentUfi.estatus = "En Proceso";
	updateAll(null);
}

private function evtSecurityError(evento : SecurityErrorEvent) : void {
}

private function evtUploadCompleteData(evento : Object) : void {
}

